package cc.rengu.oltp.service.realize;

import cc.rengu.oltp.service.model.DubboResult;

/**
 * 收单公共服务组件
 * Created by 王成 on 2018/7/3.
 */
public interface DubboService<T> {
    /**
     * 业务服务调用
     *
     * @param request  业务请求信息
     * @param rspClass 业务响应类
     * @return 业务处理结果
     * @throws Exception 异常
     */
    DubboResult callBizService(T request, Class rspClass) throws Exception;

    /**
     * 原子服务调用
     *
     * @param request     业务请求信息
     * @param serviceName 原子服务名
     * @param rspClass    业务响应类
     * @return 业务处理结果
     * @throws Exception 异常
     */
    DubboResult callAtomService(T request, String serviceName, Class rspClass) throws Exception;

    /**
     * 同步调用Dubbo服务
     *
     * @param dubboBean    dubbo接口名
     * @param dubboMethod  接口方法名
     * @param dubboRequest dubbo请求对象
     * @return dubbo应答对象
     * @throws Exception 异常
     */
    Object callDubboService(String dubboBean, String dubboMethod, Object dubboRequest) throws Exception;

    /**
     * 应用内Dubbo方法调用（只适用于Dubbo服务方与消费方在同一个应用中的情况）
     *
     * @param innerClasz   Dubbo服务方接口的实现类
     * @param innerMethod  Dubbo服务方的内部接口方法名
     * @param innerRequest Dubbo服务方内部接口请求参数
     * @return Dubbo服务方接口调用返回结果
     * @throws Exception 异常
     */
    Object callDubboInnerMethod(Class innerClasz, String innerMethod, Object innerRequest) throws Exception;

    /**
     * 异步调用Dubbo服务
     * 若要处理异步调用的应答结果，则新建Class继承DubboAsynBaseService类，从内部XML树获取DUBBO_RESPONSE对象进行处理
     *
     * @param dubboBean       dubbo接口名
     * @param dubboMethod     接口方法名
     * @param dubboRequest    dubbo请求对象
     * @param asynServiceName 异步调用服务名
     * @param callTimes       异步调用次数
     * @param gatType         重发间隔类型（0-等时长间隔，1-等幂间隔）
     * @param gatTime         重发间隔时间
     * @return 0-提交成功，其它-提交失败
     * @throws Exception 异常
     */
    int asynCallDubboService(String dubboBean, String dubboMethod, Object dubboRequest, String asynServiceName, int callTimes, int gatType, int gatTime) throws Exception;

    /**
     * 异步调用Dubbo服务（只发送一次）
     * 若要处理异步调用的应答结果，则新建Class继承DubboAsynBaseService类，从内部XML树获取DUBBO_RESPONSE对象进行处理
     *
     * @param dubboBean       dubbo接口名
     * @param dubboMethod     接口方法名
     * @param dubboRequest    dubbo请求对象
     * @param asynServiceName 异步调用服务名
     * @return 0-提交成功，其它-提交失败
     * @throws Exception 异常
     */
    int asynCallDubboService(String dubboBean, String dubboMethod, Object dubboRequest, String asynServiceName) throws Exception;

    /**
     * 应用内异步Dubbo方法调用（只适用于Dubbo服务方与消费方在同一个应用中的情况）
     * 若要处理异步调用的应答结果，则新建Class继承DubboAsynBaseService类，从内部XML树获取DUBBO_RESPONSE对象进行处理
     *
     * @param innerClasz      Dubbo服务方接口的实现类
     * @param dubboMethod     接口方法名
     * @param dubboRequest    dubbo请求对象
     * @param asynServiceName 异步调用服务名
     * @param callTimes       异步调用次数
     * @param gatType         重发间隔类型（0-等时长间隔，1-等幂间隔）
     * @param gatTime         重发间隔时间
     * @return 0-提交成功，其它-提交失败
     * @throws Exception 异常
     */
    int asynCallDubboInnerMethod(Class innerClasz, String dubboMethod, Object dubboRequest, String asynServiceName, int callTimes, int gatType, int gatTime) throws Exception;

    /**
     * 应用内异步Dubbo方法调用（只发送一次）
     * 若要处理异步调用的应答结果，则新建Class继承DubboAsynBaseService类，从内部XML树获取DUBBO_RESPONSE对象进行处理
     *
     * @param innerClasz      Dubbo服务方接口的实现类
     * @param dubboMethod     接口方法名
     * @param dubboRequest    dubbo请求对象
     * @param asynServiceName 异步调用服务名
     * @return 0-提交成功，其它-提交失败
     * @throws Exception 异常
     */
    int asynCallDubboInnerMethod(Class innerClasz, String dubboMethod, Object dubboRequest, String asynServiceName) throws Exception;
}
